﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection.Metadata.Ecma335;
using System.Threading.Tasks;
using 旅游管理系统.Dtos;

namespace 旅游管理系统.ValidationAttributes
{
    /// <summary>
    /// 旅游路线 Title与 Description必须不同
    /// </summary>
    public class TouristRouteTitleMustBeDifferentFromDescriptionAttribute : ValidationAttribute //是位于System.ComponentModel.DataAnnotations下面的
    {
        protected override ValidationResult IsValid(
            object value,  //输入的数据对象
            ValidationContext validationContext  //上下文关系对像，但这次validationContext对象所访问的不再是属性级别的数据，而是类级别的数据
        )
        {
            //var touristRouteDto = (TouristRouteForCreationDto)validationContext.ObjectInstance;
            var touristRouteDto = (TouristRouteForManipulationDto)validationContext.ObjectInstance;
            //可以直接使用DTO对象的数显来访问相关的数据了
            if (touristRouteDto.Title == touristRouteDto.Description) //当Title 与 Description一样的时候，我们的验证就失败了
            {
                return new ValidationResult(  //yield return可以确保ValidationResult接下来的代码下次调用的时候还会执行，ValidationResult是一个可以提供错误消息并返回类名或者成员变量的名称的对象
                    "路线名称必须与路线描述不同", //错误信息
                    new[] { "TouristRouteForCreationDto" } //抛出异常的路径
                    );
            }
            return ValidationResult.Success;
        }
    }
}
